#!/bin/bash
notifmail="rcampoverde@cyberline.com.pe,monitoreo@cyberline.com.pe"
# entramos al directorio de ejecucion
cd /SCRIPTS/chkiptables
# indicamos el archivo donde volcaremos las reglas que estan escritas en archivos de texto:
tmpwall=/tmp/firewall
# escribimos las greglas de los archivos de firewall en el archivo temporal excluyendo
# las lineas que terminen en dominios conocidos:
cat /Firewall/{firewall,firewall.fw} | grep -Eiv "*\.com |*\.net |*\.edu |*\.org |*\.pe |*\.com |*\.info"  > $tmpwall
# definimos archivos temporales
iptablesdumptmp="./dumpfile.tmp"
iptablesdump="./dumpfile"
# definimos el archivo donde se iran ejecutando las reglas de filtrado:
diferentes=./diferentes.bash
# nos aseguramos que los archivos esten vacios:
printf "" > $diferentes
echo "" > ./diferentes.log
echo "" > $iptablesdump
echo "" > $iptablesdumptmp
echo "" > ./comando.out
echo "" > iptablesdumptmp.tmp.tmp
# vocamos las reglas de iptables desde la memoria hasta el archivo
iptables-save > $iptablesdumptmp
# borramos los "-m tcp, udp" y cambiamos los "dports por dport" y lo vaceamos a unarchivo 
# temporal, esto por que no escriben bien las reglas!!!
sed -e 's/-m tcp//' $iptablesdumptmp | sed -e 's/set-xmark/set-mark/g' |sed -e 's/\/0xffffffff//g' |sed -e 's/-m udp//' |  /bin/sed 's/--dports/--dport/g'| /bin/sed 's/--sports/--sport/g' > ./iptablesdumptmp.tmp
# separamos los comentarios y demas de las reglas que sirven:
cat ./iptablesdumptmp.tmp > $iptablesdumptmp
cat  $iptablesdumptmp | grep -E '\-A' > $iptablesdump

# tambien excluimos las reglas escritas por programas e tiempo real, por ejemplo fail2ban:
expresiones='log-level|fail2ban|_In|_Out'
#expresiones='fail2ban'
cat $iptablesdump | grep -ivE $expresiones > ./iptablesdumptmp.tmp.tmp
cat ./iptablesdumptmp.tmp.tmp > $iptablesdump
# reemplazamos los /32 /16 /8 por nada para que no de problemas en la busqueda de las reglas:
/bin/cat $iptablesdump | while read LINEA; do
for i in $LINEA; do 

	if [[ "$i" != "-A" ]]; then  
	   ii=$(echo $i |  /bin/sed '$s/mangle//g' | /bin/sed '$s/\/32//' | /bin/sed '$s/\/29//'| /bin/sed '$s/\/28//'  | /bin/sed '$s/\/16//' | /bin/sed '$s/\/8//' | /bin/sed '$s/\/24//' |/bin/sed '$s/,/\\\|/g' | /bin/sed '$s/--tcp-flags//g' | /bin/sed '$s/1\/sec/1\/s/g' )
	   cadena="$cadena grep -i -e '$ii'|" 
	   fi
done

# tambien borramos los puntos finales que se pasaron por ahi:
cadena2=$(echo "$cadena" | /bin/sed '$s/.$//')
#  unimos las partes de la cadena que sera ejecutada para filtrar las reglas
cadena3='/bin/cat '$tmpwall' | '$cadena2
# escribimos la cadena a ejecutar en el archivo comando.out
echo "$cadena3" > ./comando.out
# ejecutamos las reglas
bash ./comando.out > /dev/null 2>&1
# evaluamos el resultado
resultado=$?
# evaluamos si la regla  esta en caliente o no:
if (( "$resultado" == "1" )); then
	echo "FAIL"
echo "cat ./dumpfile $cadena3" | sed '$s/\/bin\/cat//g' | sed '$s/\/tmp\/firewall//g' >> diferentes.bash
else
a=1
fi
cadena=''

done 
# damos permiso de ejecucion a la lista de reglas a evaluar:
chmod +x ./diferentes.bash
echo "" > ./diferentes.log
# ejecutamos las reglas para evaluar
bash diferentes.bash | while read REGLA; do
# buscamos si la regla es mangle o nat:
echo "$REGLA" | grep  "set-mark" > /dev/null
es_mangle="$?"
echo "$REGLA" | grep -E  "PREROUTING|POSTROUTING" > /dev/null
es_nat="$?"

if (( "$es_mangle" == "0" )); then
   echo "iptables -t mangle $REGLA" >> ./diferentes.log
else 
   if (( "$es_nat" == "0" )); then
   echo "iptables -t nat $REGLA" >> ./diferentes.log
   else 
   echo "iptables $REGLA" >> ./diferentes.log
   fi
fi
# agregamois el "iptables" antes de cada regla que no esta escrita, es decir, esta solo en memoria:
#echo "iptables $REGLA" >> ./diferentes.log
done 
contador=$(cat diferentes.bash | wc -l)
#printf "" > $tmpwall
echo "Borrando archivos temporales:"
rm comando.out dumpfile dumpfile.tmp iptablesdumptmp.tmp iptablesdumptmp.tmp.tmp
echo "Hay $contador reglas en caliente, salida en diferentes.log"
if (( "$contador" != "0")); then
   cat ./diferentes.log | mail -s "hay reglas en caliente en $(hostname).$(date +"%d-%m-%Y")" $notifmail 
fi
